import { defaultCompare, Compare } from '../../util';
export type MinAndMaxParam<T> = {
    minValue: T,
    maxValue: T,
};
/**
 * 取数组的最大值
 * @param array 目标数组
 * @param compareFn 比较函数
 */
export function findMaxValue<T>(array: T[] = [], compareFn = defaultCompare): T {
    let maxValue = array[0]; // 默认取第一项
    // 从第二项开始遍历（数组长度不足2的话，不会进入for循环）
    for (let i = 1, al = array.length; i < al; i ++) {
        // 寻找最大的（compareFn默认升序，所以选择Compare.BIGGER_THAN）
        if (compareFn(array[i], maxValue) === Compare.BIGGER_THAN) {
            maxValue = array[i];
        }
    }
    return maxValue;
}

/**
 * 取数组的最小值
 * @param array 目标数组
 * @param compareFn 比较函数
 */
export function findMinValue<T>(array: T[] = [], compareFn = defaultCompare): T {
    let minValue = array[0]; // 默认取第一项
    // 从第二项开始遍历（数组长度不足2的话，不会进入for循环）
    for (let i = 1, al = array.length; i < al; i ++) {
        // 寻找最大的（compareFn默认升序，所以选择Compare.LESS_THAN
        if (compareFn(array[i], minValue) === Compare.LESS_THAN) {
            minValue = array[i];
        }
    }
    return minValue;
}

/**
 * 取数组的最小值和最大值
 * @param array 目标数组
 * @param compareFn 比较函数
 */
export function findMinAndMaxValue<T>(array: T[] = [], compareFn = defaultCompare): MinAndMaxParam<T> {
    let minValue = array[0]; // 默认取第一项
    let maxValue = array[0]; // 默认取第一项
    // 从第二项开始遍历（数组长度不足2的话，不会进入for循环）
    for (let i = 1, al = array.length; i < al; i ++) {
        if (compareFn(array[i], minValue) === Compare.LESS_THAN) {
            minValue = array[i];
        } else if ((compareFn(array[i], minValue) === Compare.BIGGER_THAN)) {
            maxValue = array[i];
        }
    }
    return { minValue, maxValue };
}
